import axios from 'axios'
import { ElMessage } from 'element-plus'
import router from '@/router/index'
import { useUserStore } from '@/store/user'

// 创建 axios 实例
const request = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL || '/api', // 从环境变量获取基础URL
  timeout: 10000, // 请求超时时间
  headers: {
    'Content-Type': 'application/json'
  }
})

// 获取 token 的函数
function getToken() {
  // 优先从 Pinia store 获取
  const userStore = useUserStore()
  if (userStore.token) {
    return userStore.token
  }

  // 如果 store 中没有，从 localStorage 获取
  const localToken = localStorage.getItem('token')
  if (localToken) {
    // 同步到 store
    userStore.setToken(localToken)
    return localToken
  }

  return null
}

// 请求拦截器
request.interceptors.request.use(
  (config) => {
    // 获取 token
    const token = getToken()

    // 如果有 token，添加到请求头
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }

    return config
  },
  (error) => {
    console.error('请求错误:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
request.interceptors.response.use(
  (response) => {
    const { data } = response

    // 适配后端响应格式：{ code, msg, data }
    if (data.code === 200) {
      if (response.config.method !== 'get') {
        ElMessage.success(data.msg)
      }
      return data.data
    } else {
      switch (data.code) {
        case 401:
          // 未授权，清除 token 并跳转到登录页
          ElMessage.error('登录已过期，请重新登录');
          const userStore = useUserStore();
          if (userStore.isLoggedIn) { // 仅在已登录状态下执行登出（避免重复执行）
            userStore.logout();
            router.push('/login'); // 跳转登录页
          }
          break
        case 403:
          ElMessage.error('没有权限访问该资源')
          break
        case 404:
          ElMessage.error('请求的资源不存在')
          break
        case 500:
          ElMessage.error(data?.msg || '请求失败')
          throw new Error(data?.msg || '请求失败')
        default:
          ElMessage.error(data?.msg || '请求失败')
      }
    }
  }
)

// 封装常用的请求方法
export const http = {
  // GET 请求
  get(url, params = {}, config = {}) {
    return request.get(url, { params, ...config })
  },

  // POST 请求
  post(url, data = {}, config = {}) {
    return request.post(url, data, config)
  },

  // PUT 请求
  put(url, data = {}, config = {}) {
    return request.put(url, data, config)
  },

  // DELETE 请求
  delete(url, config = {}) {
    return request.delete(url, config)
  },

  // 上传文件
  upload(url, file, config = {}) {
    const formData = new FormData()
    formData.append('file', file)

    return request.post(url, formData, {
      headers: {
        'Content-Type': 'multipart/form-data'
      },
      ...config
    })
  }
}

export default request 